import requests
import time

def get_all_repos(org, access_token=None):
    """
    获取指定组织的所有仓库（带分页和速率限制）
    
    :param org: 组织名称
    :param access_token: Gitee访问令牌（可选）
    :return: 仓库列表
    """
    url = f"https://gitee.com/api/v5/orgs/{org}/repos"
    headers = {'User-Agent': 'Mozilla/5.0'}
    repos = []
    page = 1
    per_page = 100  # 每页最大数量
    
    if access_token:
        headers['Authorization'] = f'token {access_token}'

    while True:
        try:
            # 请求参数
            params = {
                'page': page,
                'per_page': per_page,
                'type': 'all'  # 获取所有类型仓库
            }

            # 发送请求
            response = requests.get(url, params=params, headers=headers)
            response.raise_for_status()  # 检查HTTP错误

            # 解析响应
            current_page_repos = response.json()
            if not current_page_repos:
                break  # 无更多数据

            # 存储结果
            repos.extend(current_page_repos)
            print(f"已获取第 {page} 页，当前页仓库数：{len(current_page_repos)}")

            # 检查是否最后一页
            if len(current_page_repos) < per_page:
                break

            # 翻页
            page += 1

            # 速率限制控制（1秒/请求）
            time.sleep(1)

            # 进阶速率控制（根据API返回的头信息）
            rate_limit_remaining = int(response.headers.get('X-RateLimit-Remaining', 100))
            if rate_limit_remaining < 5:  # 预留安全余量
                reset_time = int(response.headers.get('X-RateLimit-Reset', 60))
                print(f"速率限制即将用完，等待 {reset_time} 秒")
                time.sleep(reset_time)

        except requests.exceptions.RequestException as e:
            print(f"请求发生异常：{str(e)}")
            break

    return repos

if __name__ == "__main__":
    # 配置信息
    org_name = "your_org_name"  # 替换为你的组织
    token = "your_access_token_here"  # 替换为你的真实令牌

    # 获取仓库
    repositories = get_all_repos(org_name, token)
    
    # 输出结果
    print("\n共获取仓库数量：", len(repositories))
    print("\n仓库列表：")
    for idx, repo in enumerate(repositories, 1):
        print(f"{idx}. {repo['name']} ({repo['html_url']})")
